package com.bifang.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class MathUtil {
    public static List<String> MiddleToEndExpress(List<String> strings){
        //创建栈，存放运算符
        Stack<String> operStack = new Stack<>();
        //因为这个栈不需要出栈，所以使用集合
        List<String> sumList = new ArrayList<>();
        for (String s : strings) {
            //判断是否是数据
            if (s.matches("\\d+")){
                sumList.add(s);//是数据直接加入
            }else if ("(".equals(s)){//判断是否是左括号
                operStack.push(s);//是，直接放入符号栈
            }else if (")".equals(s)){//判断是否是右括号
                while (!"(".equals(operStack.peek())){//如果栈顶是左括号，退出循环
                    sumList.add(operStack.pop());//不是左括号，就将栈顶的符号依次放入集合
                }
                //循环结束，表示栈顶是左括号，把左括号去掉，就去掉了一对括号
                operStack.pop();
            }else {//前面的判断都不是，那就是运算符
                //如果符号栈为空，并且运算符小于等于栈顶的运算符优先级
                while (operStack.size() != 0 && Calcu(s) <= Calcu(operStack.peek())){
                    //就将栈顶的运算符放入集合中
                    sumList.add(operStack.pop());
                }
                //然后将符号放入符号栈中
                operStack.push(s);
            }
        }
        //遍历结束，将符号栈剩余的符号依次取出放入集合中
        while (operStack.size() != 0){
            sumList.add(operStack.pop());
        }
        //最后将集合返回
        return sumList;
    }
    public static double endCalculator(List<String> stringList){
        //创建栈，存放数据
        Stack<String> dataStack = new Stack<>();
        //循环遍历集合
        for (String s : stringList) {
            //正则表达式判断是否是数据，如果是，就放入栈中
            if (s.matches("\\d+")){
                dataStack.push(s);
            }else {//否则就是运算符
                //取出两个数据
                double num1 = Double.valueOf(dataStack.pop());
                double num2 = Double.valueOf(dataStack.pop());
                //存放运算结果的变量
                double res = 0;
                //判断运算符继续相应的运算
                if ("+".equals(s)){
                    res = num1 + num2;
                }else if ("-".equals(s)) {
                    res = num2 - num1;
                }else if ("*".equals(s)) {
                    res = num1 * num2;
                }else if ("/".equals(s)) {
                    res = num2 / num1;
                }else if ("%".equals(s)) {
                    res = num2 % num1;
                }else {
                    throw new RuntimeException("运算符异常！");
                }
                //运算过后将结果又放入栈中
                dataStack.push("" + res);
            }
        }
        //最后返回栈中唯一的数据既是结果
        return Double.valueOf(dataStack.pop());
    }

    public static int Calcu(String s){
        char ch = s.charAt(0);
        if (ch == '-' || ch == '+'){
            return 0;
        } else if (ch == '*' || ch == '/' || ch == '%') {
            return 1;
        }
        return -1;
    }
}
